/*
 * x/can/error.h
 *
 * Definitions for CAN Broadcast Manager (BCM)
 *
 * @author Halis Duraki <duraki.halis@nsoft.ba>
 * /usr/include/duraki
 */

#ifndef _UAPI_CAN_ERROR_H
#define _UAPI_CAN_ERROR_H

#define CAN_ERR_DLC 8 /* dlc for error message frames */

/* error class (mask) in can_id */
#define CAN_ERR_TX_TIMEOUT			0x00000001U /* TX timeout */
#define CAN_ERR_LOSTARB				0x00000002U /* lost arbitation / data [0] */
#define CAN_ERR_CRTL				0x00000004U /* controller problems / data [1] */
#define CAN_ERR_PROT				0x00000008U /* protocol violations / data [2..3] */
#define CAN_ERR_TRX					0x00000010U /* transceiver status / data [4] */
#define CAN_ERR_ACK					0x00000020U /* received no ACK on transmission */
#define CAN_ERR_BUSOFF				0x00000040U /* bus off */
#define CAN_ERR_BUSERROR			0x00000080U /* bus error */
#define CAN_ERR_RESTARTED			0x00000100U /* controlelr restarted */

/* arbitration lost in bit / data [0] */
#define CAR_ERR_LOSTARB_UNSPEC 0x00 /* unspecified */

/* error status of CAN-controller / data[1] */
#define CAN_ERR_CRTL_UNSPEC			0x00 /* unspecified */
#define CAN_ERR_CRTL_RX_OVERFLOW	0x01 /* RX buffer overflow */
#define CAN_ERR_CRTL_TX_OVERFLOW	0x02 /* TX buffer overflow */
#define CAN_ERR_CRTL_RX_WARNING		0x04 /* warning level for RX erros */
#define CAN_ERR_CRTL_TX_WARNING		0x08 /* warning level for TX erros */
#define CAN_ERR_CRTL_RX_PASSIVE		0x10 /* error pasive status for RX */
#define CAN_ERR_CRTL_TX_PASSIVE		0x20 /* error passive status for TX */

#define CAN_ERR_CRTL_ACTIVE			0x40 /* recovered to error active state */

/* error in CAN protocol (type) / data[2] */
#define CAN_ERR_PROT_UNSPEC			0x00 /* unspecified */
#define CAN_ERR_PROT_BIT			0x01 /* single bit error */
#define CAN_ERR_PROT_FORM			0x02 /* frame format error */
#define CAN_ERR_PROT_STUFF			0x04 /* bit stuffing error */
#define CAN_ERR_PROT_BIT0			0x08 /* unable to send dominant bit */
#define CAN_ERR_PROT_BIT1			0x10 /* unable to send recessive bit */
#define CAN_ERR_PROT_OVERLOAD		0x20 /* bus overload */
#define CAN_ERR_PROT_ACTIVE			0x40 /* active error announcement */
#define CAN_ERR_PROT_TX				0x80 /* error while transmission */

/* error in CAN protocol (location) / data[3] */
#define CAN_ERR_PROT_LOC_UNSPEC		0x00 /* unspecified */
#define CAN_ERR_PROT_LOC_SOF		0x03 /* start of frame */
#define CAN_ERR_PROT_LOC_ID28_21	0x02 /* ID bits 28 - 21 (SFF: 10 - 3) */
#define CAN_ERR_PROT_LOC_ID20_18	0x06 /* ID bits 20 - 18 (SFF: 2 - 0) */
#define CAN_ERR_PROT_LOC_SRTR		0x04 /* substitue RTR (SFF: RTR) */
#define CAN_ERR_PROT_LOC_IDE		0x05 /* identifier extension */
#define CAN_ERR_PROT_LOC_ID17_13	0x07 /* ID bits 17-13 */
#define CAN_ERR_PROT_LOC_ID12_05	0x0F /* ID bits 12-5 */
#define CAN_ERR_PROT_LOC_ID04_00	0x0E /* ID bits 4-0 */
#define CAN_ERR_PROT_LOC_RTR		0x0C /* RTR */
#define CAN_ERR_PROT_LOC_RES1		0x0D /* reserved bit 1 */
#define CAN_ERR_PROT_LOC_RES0		0x09 /* reserved bit 0 */
#define CAN_ERR_PROT_LOC_DLC		0x0B /* data length code */
#define CAN_ERR_PROT_LOC_DATA		0x0A /* data section */
#define CAN_ERR_PROT_LOC_CRC_SEQ	0x08 /* CRC sequence */
#define CAN_ERR_PROT_LOC_CRC_DEL	0x18 /* CRC delimiter */
#define CAN_ERR_PROT_LOC_ACK		0x19 /* ACK slot */
#define CAN_ERR_PROT_LOC_ACK_DEL	0x1B /* ACK delimiter */
#define CAN_ERR_PROT_LOC_EOF		0x1A /* end of frame */
#define CAN_ERR_PROT_LOC_INTERM		0x12 /* intermission */

/* error tatus of CAN-transceiver / data[4] */
#define CAN_ERR_TRX_UNSPEC					0x00 /* 0000 0000 */
#define CAN_ERR_TRX_CANH_NO_WIRE			0x04 /* 0000 0100 */
#define CAN_ERR_TRX_CANH_SHORT_TO_BAT		0x05 /* 0000 0101 */
#define CAN_ERR_TRX_CANH_SHORT_TO_VCC		0x06 /* 0000 0110 */
#define CAN_ERR_TRX_CANH_SHORT_TO_GND		0x07 /* 0000 0111 */
#define CAN_ERR_TRX_CANL_NO_WIRE			0x40 /* 0100 0000 */
#define CAN_ERR_TRX_CANL_SHORT_TO_BAT		0x50 /* 0101 0000 */
#define CAN_ERR_TRX_CANL_SHORT_TO_VCC		0x60 /* 0110 0000 */
#define CAN_ERR_TRX_CANL_SHORT_TO_GND		0x70 /* 0111 0000 */
#define CAN_ERR_TRX_CANL_SHORT_TO_CANH		0x80 /* 1000 0000 */

/* controller specific additional information / data [5..7] */

#endif /* _UAPI_CAN_ERROR_H */